package main

import "fmt"
import "reflect"

//reflect代码包也提供了一些其它函数来动态地创建出来一些非定义组合类型。
//
//注意，到目前为止（Go 1.17），我们无法通过反射动态创建一个接口类型。这是Go反射目前的一个限制。
//
//另一个限制是使用反射动态创建结构体类型的时候可能会有各种不完美的情况出现。
//
//第三个限制是我们无法通过反射来声明一个新的类型。

func main() {
	ta := reflect.ArrayOf(5, reflect.TypeOf(123))
	fmt.Println("ta:", ta) // [5]int
	tc := reflect.ChanOf(reflect.SendDir, ta)
	fmt.Println("tc:", tc) // chan<- [5]int
	tp := reflect.PtrTo(ta)
	fmt.Println("tp:", tp) // *[5]int
	ts := reflect.SliceOf(tp)
	fmt.Println("ts:", ts) // []*[5]int
	tm := reflect.MapOf(ta, tc)
	fmt.Println("tm:", tm) // map[[5]int]chan<- [5]int
	tf := reflect.FuncOf([]reflect.Type{ta},
		[]reflect.Type{tp, tc}, false)
	fmt.Println("tf:", tf) // func([5]int) (*[5]int, chan<- [5]int)
	tt := reflect.StructOf([]reflect.StructField{
		{Name: "Age", Type: reflect.TypeOf("abc")},
	})
	fmt.Println("tt:", tt)                       // struct { Age string }
	fmt.Println("tt.NumField():", tt.NumField()) // 1
}
